package cn.taskservice.common.utils.jasypt;

import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig;
import org.jasypt.iv.RandomIvGenerator;

/**
 * Jasypt 加密工具类
 * 说明：需依赖 jasypt-spring-boot-starter
 */
public class JasyptUtil {

    private static final String ALGORITHM = "PBEWITHHMACSHA512ANDAES_256"; // 推荐算法
    private static final String ENCRYPTED_PREFIX = "ENC(";                // Spring Boot 加密属性前缀
    private static final String ENCRYPTED_SUFFIX = ")";

    /**
     * 创建加密器（线程安全）
     * @param password 加密密钥（需妥善保管）
     */
    public static StandardPBEStringEncryptor createEncryptor(String password) {
        EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
        config.setPassword(password);              // 加密密钥
        config.setAlgorithm(ALGORITHM);           // 加密算法
        config.setIvGenerator(new RandomIvGenerator()); // 随机IV（增强安全性）
        config.setKeyObtentionIterations(1000);    // 哈希迭代次数

        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        encryptor.setConfig(config);
        return encryptor;
    }

    /**
     * 加密明文
     * @param plaintext 待加密的明文
     * @param password  加密密钥
     * @return 加密后的字符串（自动添加 ENC(...) 包装，兼容 Spring Boot）
     */
    public static String encrypt(String plaintext, String password) {
        StandardPBEStringEncryptor encryptor = createEncryptor(password);
        String encrypted = encryptor.encrypt(plaintext);
        return ENCRYPTED_PREFIX + encrypted + ENCRYPTED_SUFFIX;
    }

    /**
     * 解密密文
     * @param encryptedText 加密后的字符串（支持带 ENC(...) 或不带）
     * @param password      加密密钥
     * @return 解密后的明文
     */
    public static String decrypt(String encryptedText, String password) {
        // 去除 ENC(...) 包装（如果存在）
        if (encryptedText.startsWith(ENCRYPTED_PREFIX) && encryptedText.endsWith(ENCRYPTED_SUFFIX)) {
            encryptedText = encryptedText.substring(
                    ENCRYPTED_PREFIX.length(),
                    encryptedText.length() - ENCRYPTED_SUFFIX.length()
            );
        }

        StandardPBEStringEncryptor encryptor = createEncryptor(password);
        return encryptor.decrypt(encryptedText);
    }

    /**
     * 测试用例
     */
    public static void main(String[] args) {
        // 使用 Java 17 的 switch 表达式
        String day = "TUESDAY";
        String typeOfDay = switch (day) {
            case "SATURDAY", "SUNDAY" -> "Weekend";
            case "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY" -> "Weekday";
            default -> "Unknown";
        };
        System.out.println("Day type: " + typeOfDay);

        // 使用 Java 17 的文本块 (Text Block)
        String json = """
                {
                    "name": "Java17Test",
                    "feature": "switch expression and text blocks"
                }
                """;
        System.out.println("JSON example:");
        System.out.println(json);
    }
}